package com.um.springboot.starter.service;

import com.um.springboot.starter.entity.Page;

import java.util.List;
import java.util.Map;

/**
 * @author 邓南辉
 * @date 2019/12/7
 * @copyright 广州优匠科技有限公司
 */
public interface CommonService {

    ///////////////////////////////保存操作///////////////////////////////////

    String getComId();
    /**
     * 添加记录，饶开框架，不做历史记录
     */
    boolean saveRecord(String tableName, Map entity);

    /**
     * 保存一个对象,如果对象存在就更新，不存在就插入
     * @param tableName 表名
     * @param map 属性和值
     * @return 执行成功返回true
     */
    boolean save(String tableName, Map<String, Object> map);

    /**
     * 保存一个对象,如果对象存在就更新，不存在就插入
     * @param tableName 表名
     * @param map 属性和值
     * @param properties 额外添加的属性，类型geometry专用
     * @param values 额外添加的值
     * @return 返回保存后的实体Map
     */
    Map<String,Object> saveEntity(String tableName, Map<String, Object> map, String[] properties, String[] values);

    /**
     * 同时保存多个对象
     * @param mapTable key和value都是表名的Map
     * @param mapValue key为表名， value为实体对象的Map
     * @return 执行成功返回true
     */
    boolean saveCommand(Map<String, String> mapTable, Map<String, Map<String, Object>> mapValue);


    /**
     * 保存一个对象,如果对象存在就更新，不存在就插入
     * @param tableName 表名
     * @param map 属性和值
     * @return 返回保存后的实体Map
     */
    Map<String,Object> saveEntity(String tableName, Map<String, Object> map);

    /**
     * 保存一个对象,并且会比code列自动编号,表中一定要有parent_code列,如果对象存在就更新，不存在就插入
     * @param tableName 表名
     * @param map 属性和值
     */
    boolean saveCodeEntity(String tableName, Map<String, Object> map);

    /**
     * 保存移动树节点对象,重新生成code并修改所有子节点code
     * @param tableName
     * @param map
     * @return
     */
    boolean saveMoveCodeEntity(String tableName, Map<String, Object> map);





    /**
     * 保存一个主表对象和子表的多个对象
     * @param tableName 主表名
     * @param map 主对象
     * @param subTableName 子表名
     * @param subList 子表对象列表
     */
    boolean saveAndSubList(String tableName, Map<String, Object> map, String subTableName, List<Map<String, Object>> subList);

    /**
     * 保存一个对象和中间表的关系
     * @param tableName 主表名
     * @param map 主对象
     * @param otherTableName 另外个主表名
     * @param midTableName 中间表列表
     * @param subList 关系ID列表
     */
    boolean saveAndMiddle(String tableName, Map<String, Object> map, String otherTableName, String midTableName, List<Object> subList);

    /**
     * 保存多个对象列表
     * @param tableName 表名
     * @param list 对象列表
     */
    boolean saveList(String tableName, List<Map<String, Object>> list);

    /**
     * 更改一个对象
     * @param tableName 表名
     * @param map 实体Map
     */
    boolean update(String tableName, Map<String, Object> map);


    /**
     * 根据主键删除表
     * @param tableName 表名
     * @param id 表主键ID
     * @return 执行成功返回true
     */
    boolean delete(String tableName, String id);

    /**
     * 删除一个列表
     * @param tableName 表名
     * @param list 主键ID列表
     * @return 执行成功返回true
     */
    boolean delete(String tableName, List<String> list);

    /**
     * 删除多个主表对象及对应关系子表
     * @param tableName 主表名
     * @param foreignTable 外键表名
     * @param idList 主表ID列表
     * @return 执行成功返回true
     */
    boolean deleteListAndForeign(String tableName, String foreignTable, List<Object> idList);


    /**
     * 根据指定属性删除对象
     * @param tableName 表名
     * @param properties 属性数组
     * @param values 值数组
     * @return 执行成功返回true
     */
    boolean deleteByProperties(String tableName, String[] properties, Object[] values);

    /**
     * 根据一个属性删除对象
     * @param tableName 表名
     * @param property 属性名
     * @param value 值
     * @return 执行成功返回true
     */
    boolean delete(String tableName, String property, Object value);

    /**
     * 递归逻辑删除一个树桔构的记录以及它的所有子节点
     * @param tableName 表名
     * @param list 主键ID列表
     * @param parentColumn 父节点列名
     * @return 执行成功返回true
     */
    @SuppressWarnings("unchecked")
    boolean deleteNode(String tableName, List<String> list, String parentColumn);

    /**
     * 根据多个属性查询指定列表
     * @param tableName 表名
     * @param properties 属性名称
     * @param values 属性值
     * @param orderNames 排序字段数组
     * @param sortOns 降序或升序数组
     * @return 返回一个列表
     */
    List queryList(String tableName, String[] properties, Object[] values, Object[] orderNames, Object[] sortOns);

    /**
     * 根据多个属性查询指定列表
     * @param tableName 表名
     * @param properties 属性名称
     * @param values 属性值
     * @return 返回一个列表
     */
    List queryList(String tableName, Object[] properties, Object[] values);

    /**
     * 通过分页条件查询列表
     * @param tableName 表名称
     * @param columns 查询列名
     * @param map 查询条件
     * @param custom 自定义条件
     * @return
     */
    List queryList(String tableName, Object[] columns, Map map, Map custom);

    /**
     * 通过分页条件查询列表
     * @param tableName 表名称
     * @param columns 查询列名
     * @param map 查询条件
     * @param custom 自定义条件
     * @param start start
     * @param limit limit
     * @return
     */
    List queryList(String tableName, Object[] columns, Map map, Map custom, int start, int limit);

    /**
     * 根据多个属性查询指定属性的列表
     * @param tableName 表名
     * @param ignoreCcolumns 查询指 定忽略的列名
     * @param properties 属性名称
     * @param values 属性值
     * @param orderNames 排序字段
     * @param sortOns 降序或升序
     * @return 返回一个列表
     */
    List queryListIgnore(String tableName, Object[] ignoreCcolumns, Object[] properties, Object[] values, String[] orderNames, String[] sortOns, String oper);

    //////////////////////////////////////////////////////// like 操作////////////////////////////////////////////////////////
    /**
     * 根据多个属性查询指定列表
     * @param tableName 表名
     * @param properties 属性名称数组
     * @param values 属性值数组
     * @param orderNames 排序字段数组
     * @param sortOns 降序或升序数组
     * @return 返回一个列表
     */
    List queryLikeList(String tableName, String[] properties, Object[] values, Object[] orderNames, Object[] sortOns);

    ///////////////////////////////////////查询一个对象 map///////////////////////////////////////////////////
    /**
     * 查询一个对象
     * @param tableName 表名
     * @param columns 指定查询对象的哪些属性
     * @param properties 查询属性数组
     * @param values 查询属性值数组
     * @return 返回一个对象
     */
    Map queryEntity(String tableName, String[] columns, Object[] properties, Object[] values);

    /**
     * 查询一个对象
     * @param tableName 表名
     * @param property 查询属性
     * @param value 查询属性值
     * @return 返回一个对象
     */
    Map queryEntity(String tableName, String property, Object value);

    /**
     * 根据主键ID查询一个对象
     * @param tableName 表名
     * @param id 主键ID
     * @return 返回一个对象
     */
    Map queryEntity(String tableName, Object id);

    /**
     * 查询一个对象
     * @param tableName 表名
     * @param properties 查询属性数组
     * @param values 查询属性值数组
     * @return 返回一个对象
     */
    Map queryEntity(String tableName, String[] properties, String[] values);


    /**
     * 根据属性查询行数
     * @param tableName 表名
     * @param properties 查询属性数组
     * @param values 查询属性值数组
     * @return 返回一个整数
     */
    long queryCountByProperties(String tableName, String[] properties, Object[] values);


    /**
     * 根据SQL查询行数
     * @param sql SQL语句
     * @param list SQL参数列表
     * @return 返回一个整数
     */
    long queryCountBySQL(String sql, Object[] list);

    /**
     *
     * @param sqlName
     * @param values
     * @return
     */
    List queryListBySQLName(String sqlName, Object[] values);

    /**
     * 根据sql查询一个列表
     * @param sql SQL语句
     * @param values SQL语句的参数值
     * @return 返回一个List
     */
    @SuppressWarnings("unchecked")
    List queryListBySQL(String sql, Object[] values);

    /**
     * 自定义条件分页查询指定字段
     * @param tableName 表名称
     * @param page 分页对象
     * @param columns 查询列名
     * @param map 查询条件
     * @param custom 自定义条件
     * @return 返回一个Page对象
     */
    Page queryPageByCustom(String tableName, Page page, String[] columns, Map map, Map custom);

    /**
     * 分页查询
     * @param tableName 表名称
     * @param page 分页对象
     * @param map 查询条件
     * @return 返回一个Page对象
     */
    Page queryPage(String tableName, Page page, Map map);

    /**
     *
     * @param tableName
     * @param page
     * @param columns
     * @param map
     * @param custom
     * @return
     */
    Page queryPage(String tableName, Page page, Object[] columns, Map map, Map custom);

    /**
     * SQL分页查询
     * @param page 分页对象
     * @param sql SQL语句
     * @param sumSQL 查询总数的SQL语句
     * @param list SQL语句参数
     * @return 返回一个Page对象
     */
    Page queryPageSQL(Page page, String sql, String sumSQL, List<Object> list);

    /**
     * 根据SQL分页查询
     * @param page 分页的对象
     * @param sql  查询分页的SQL语句
     * @param sumSQL 查询总数的SQL语句
     * @param listSQL 查询列表条件参数
     * @param listSUM 查询总条数条件参数
     * @return 返回page对象
     */
    @SuppressWarnings("unchecked")
    Page queryPageSQL(Page page, String sql, String sumSQL, List<Object> listSQL, List<Object> listSUM);

    /**
     * 根据SQL名称分页查询
     * @param page 分页的对象
     * @param sqlName 查询分页的SQL名称
     * @param sumSqlName 查询总数的SQL名称
     * @param map 查询条件
     * @param custom 自定义条件
     * @return 返回page对象
     */
    @SuppressWarnings("unchecked")
    Page querySQLPage(Page page, String sqlName, String sumSqlName, Map map, Map custom);

    /**
     * SQL分页查询
     * @param page 分页对象
     * @param sqlName SQL语句名称
     * @param sumSQLName 查询总数的SQL语句名称
     * @param list SQL语句参数
     * @return 返回一个Page对象
     */
    Page queryPageSQLName(Page page, String sqlName, String sumSQLName, List<Object> list);

    /**
     * 根据SQL名称分页查询
     * @param page 分页的对象
     * @param sqlName 查询分页的SQL名称
     * @param sumSqlName 查询总数的SQL名称
     * @param listSQL 列表查询条件参数
     * @param listSUM 总条数查询条件参数
     * @return 返回page对象
     */
    @SuppressWarnings("unchecked")
    Page queryPageSQLName(Page page, String sqlName, String sumSqlName, List<Object> listSQL, List<Object> listSUM);

    /**
     * 根据SQL名称分页查询
     * @param page 分页的对象
     * @param sqlName 查询分页的SQL名称
     * @param sumSqlName 查询总数的SQL名称
     * @param list SQL的查询条件参数
     * @return 返回page对象
     */
    @SuppressWarnings("unchecked")
    Page querySQLPageValues(Page page, String sqlName, String sumSqlName, Map map, Map custom, List list);

    /**
     * 根据多个属性查询指定列表的前几条数据
     * @param tableName 表名
     * @param properties 属性名称
     * @param values 属性值
     * @param orderName 排序字段
     * @param sortOn 降序或升序
     * @param num 返回list的大小
     * @return 返回指定大小的list
     */
    List queryNum(String tableName, Object[] properties, Object[] values, String orderName, String sortOn, int num);
}
